<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of BoCobros
 *
 * @author EADeveloper
 */
class BoCobros extends easoftwarebussinesobject {

    public static function getMe($name = "BoCobros") {
        return parent::getMe($name);
    }

    public function getMaxLoteCobros() {
        $r = $this->execute("select max(codigo) ultimo from cllg_academico_cobros ");
        return $r[0]["ultimo"];
    }

    public function getDataCobro($idCobro) {
        $cobro = array();
        $cobro = $this->getArrayData(sprintf("select * from cllg_academico_cobros where id=%s", $idCobro));
        $cobro = $cobro[0];
        $boConta = BoContabilidad::getMe();
        $cobro["ajuste"] = $boConta->getAjusteInfo($cobro["PARTIDA_CARGOS"], false);
        return $cobro;
    }

    /**
     * Anula un cobro en base a su ajuste base
     * @param type $id 
     */
    public function anularCobroContable($id) {
        $c = $this->getDataCobro($id);
        $ajusteInfo = $c["ajuste"];
        $newAjuste = array();
        $newAjuste[0] = array("fecha" => date("Y-m-d"), "monto" => $c["SALDO_ACT"], "desc" => "Reverso de Cobro [" . $c["ID"]);
        $newAjuste[1] = array();
        foreach ($ajusteInfo as $r) {
            $newR = array("cta" => $r["cuenta"],
                "d" => ($r["debe"] == 1 ? 0 : 1),
                "h" => ($r["haber"] == 1 ? 0 : 1), "valor" => $c["SALDO_ACT"]);
            $newAjuste[1][] = $newR;
        }
        $boConta = BoContabilidad::getMe();
        $r = $boConta->guardarAjuste($newAjuste);
        $sql = sprintf("update cllg_academico_cobros set ESTADO='ANULADO' where ID=%s", $id);
        $this->execute($sql);
        return "Ajuste de reverso No. $r";
    }

    /**
     * Revierte un cobro que no ha sido contabilizado
     * @param type $idCobro
     * @param type $db 
     */
    public function revertirCobroNoContable($idCobro, $db) {
        $sql = "update cllg_academico_cobros set ESTADO='ANULADO' where ID=$idCobro";
        $db->query($sql);
        $anulacion = array("USUARIO" => "none", "RAZON" => "Anulacion de cobro no contabilizado!", "TIPO_DOC" => 1, "NO_DOCTO" => $idCobro);
        $this->registraAnulacion($anulacion, $db);
    }

    /**
     * Registra una anulacion
     * @param type $razon
     * @param type $db
     * @param type $referencia 
     */
    public function registraAnulacion($data) {
        $this->execute(sprintf("INSERT INTO cllg_anulacion(FECHA,USUARIO,RAZON,TIPO_DOC,NO_DOCTO) VALUES(CURDATE(),%s,%s,%s,%s)", sqlValue($data["USUARIO"], "text"), sqlValue($data["RAZON"], "text"), $data["TIPO_DOC"], sqlValue($data["NO_DOCTO"], "text")));
    }

    /**
     * Registra un movimiento en CC
     * @param type $data
     * @param type $db 
     */
    public function registerMovCta($data) {

        $idCta = $data["fkEstudiante"] != '-1' ? $data["fkEstudiante"] : $data["fkBenefactor"];
        $tipo = $data["fkEstudiante"] != '-1' ? "ESTUDIANTE" : "BENEFACTOR";
        $saldo = $this->getSaldoCta($idCta, $tipo);
        $queryMov = sprintf("INSERT INTO cllg_movs_cuenta(FK_COBRO,FK_ESTUDIANTE,FK_BENEFACTOR,MONTO,DEBE,HABER,SALDO,SALDO_ANT,SALDO_ACT,FECHA,
                            DESCRIPCION,TIPO_DOCTO) 
                        VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,CURDATE(),'%s',1)", $data["cobro"], $data["fkEstudiante"], $data["fkBenefactor"], $data["value"], $data["debe"], $data["haber"], $saldo, $saldo - $data["value"], $saldo, $data["DESCRIPCION"]);
        $this->execute($queryMov);
    }

    /**
     * Retorna el saldo de una cuenta sumando todos los cobros pendientes
     * @param type $id identificador
     * @param type $tipo tipo cuenta
     * @param type $db instancia DB
     * @return type Double
     */
    public function getSaldoCta($id, $tipo) {
        $sql = "select SUM(VALOR) deuda,FK_ESTUDIANTE
      from cllg_academico_cobros 
                WHERE TIPO='$tipo' and FK_ESTUDIANTE=$id AND ESTADO='INGRESADO' GROUP BY FK_ESTUDIANTE";
        $r = $this->getArrayData($sql);

        if (count($r)) {
            $r = $r[0];
            return $r["deuda"];
        }
        return 0.00;
    }

    /**
     * Actualiza el estado de un cobro en base al monto y la operacion realizada sobre el mismo
     * @param type $idCobro
     * @param type $montoPago
     * @param type $operacion
     * @param type $db 
     */
    public function modificarSaldoCobro($idCobro, $montoPago, $operacion) {
        $cb = $this->getArrayData("select ID,FK_ESTUDIANTE,TIPO,FK_CARGO_DETAIL_ID,VALOR,SALDO_ACT,ESTADO
                from cllg_academico_cobros where ID = $idCobro");
        $cb = $cb[0];

        $valorCobro = $cb["ESTADO"] == 'INGRESADO' ? $cb["VALOR"] : $cb["SALDO_ACT"];
        $saldoAct = $operacion == 1 ? ($valorCobro - $montoPago) : ($valorCobro + $montoPago);
        $saldoAnt = $cb["SALDO_ACT"];
        if ($saldoAct > 0) {
            $nuevoEstado = "PAGADOPARCIAL";
        }
        $this->execute("UPDATE cllg_academico_cobros SET 
                            ESTADO = '$nuevoEstado',
                            SALDO_ACT='$saldoAct',
                            SALDO_ANT='$saldoAnt' WHERE ID = $idCobro");
    }

    /**
     * genera un listado de cobros en base a un cargo manual
     * @param type $datosCargoManual
     * @param type $datosCuenta 
     */
    public function generarCobrosCargoManual($cargosManuales, $datosCuenta) {
        //echo $datosCuenta["FECHA_INICIA"];
        //echo  date("Y-m-d",strtotime(date("d/m/Y", strtotime($datosCuenta["FECHA_INICIA"]))));
        $fechaInicia = date("Y-m-d", strtotime(date("d/m/Y", strtotime($datosCuenta["FECHA_INICIA"]))));
        $totalExito = 0;
        foreach ($cargosManuales as $c) {
            $totalDias = $c["FRECUENCIA_DIAS"] * $c["REPETICIONES"];
            $fechaFin = date("Y-m-d", strtotime("+$totalDias days", strtotime($fechaInicia)));
            $insCargo = sprintf("insert into cllg_academico_cargo_cuenta(FK_CUENTA,TIPO,FK_CARGO_MANUAL,
                FECHA_COBRO_INI,FECHA_COBRO_FIN)
               values ('%s','%s',%s,'%s','%s')", $datosCuenta["FK_CUENTA"], $datosCuenta["TIPO"], $c["ID"], $fechaInicia, $fechaFin);
            $this->execute($insCargo);
            $padre = $this->getArrayData("select max(ID) padre from cllg_academico_cargo_cuenta");
            $padre = $padre[0]["padre"];
            $repetir = $c["REPETICIONES"];
            $frecDias = $c["FRECUENCIA_DIAS"];
            $sumaDias = 0;
            for ($i = 0; $i < $repetir; $i++) {
                $fechaCobro = ($sumaDias == 0 ? $fechaInicia : date("Y-m-d", strtotime("+$sumaDias days", strtotime($fechaInicia))));
                $insCobro = sprintf("insert into cllg_academico_cobros(CODIGO,FK_ESTUDIANTE,TIPO,FECHA,VALOR,
                    ESTADO,FECHA_VENCE,SALDO_ACT,FK_CARGO_MANUAL) 
                     values(0,'%s','%s','%s',%s,'%s','%s',%s,%s)", $datosCuenta["FK_CUENTA"], $datosCuenta["TIPO"], $fechaCobro, $c["VALOR"], "INGRESADO", $fechaCobro, $c["VALOR"], $padre);
                $this->execute($insCobro);
                $sumaDias+=$frecDias;
                $totalExito++;
            }
        }
        return array("generados" => $totalExito);
    }

}

?>
